package week1;

import java.io.*;
import java.util.*;

//4.选做题--- 综合类
//实现一个学生类(学号(String) 姓名(String)  专业(String)  成绩(double)...) 要实现一个学生成绩管理系统(可以通过Map集合来存储key:存储学号  value:存储学生对象)
//效果如下: ----------
//XXXX学生成绩管理
//1.查询学生信息
//2.新增学生信息
//3.批量删除学生信息
//4.退出系统
//--------------------
//要求1:可以支持程序重启还可以查询之前的学生信息(提示:要做序列化和反序列化)
//要求2:实现新增学生信息
//要求3:支持按照学号查询学生信息(支持模糊查询 比如: 输入学号001 可以查询出 sc001, sc0010,...)
//(提示:输入的搜索信息 只要是学生学号包含的信息都可以查询出来)
//要求4:支持批量删除 学生信息 可以输入多个学号 可以通过删除多个学生信息
//(提示:控制台输入sc001,sc002,sc003 然后通过字符串分割split()进行分组找到所有要删除的学号...)
//要求5:...其他功能自行扩展...
public
class Demo3 {
    static
    Map<String,Student> student=new HashMap<>();
    static Scanner sc=new Scanner(System.in);
    static {
        Input();
    }
    public static
    void main(String[] args) {
        menu();
    }
    public static
    void menu() {
        while (true) {
            System.out.println("---------------------------------");
            System.out.println("XXXX学生成绩管理");
            System.out.println("1.查询学生信息");
            System.out.println("2.新增学生信息");
            System.out.println("3.批量删除学生信息");
            System.out.println("4.退出系统");
            System.out.println("请输入操作");
            System.out.println("---------------------------------");
            int choice = sc.nextInt();
            sc.nextLine();
            switch (choice) {
                case 1: query();break;
                case 2: add(); break;
                case 3: delete();break;
                case 4: return;
            }
        }
    }

    public static void query() {
        System.out.println("输入需要查询的学号：");
        String id= sc.nextLine();
        //student.entrySet().stream()
        //.filter(e->e.getKey().contains(id))
        // .forEach(e->System.out.println
        // (e.getKey()+"\t"+e.getValue().getName()+"\t"+e.getValue().getProfessional()+"\t"+e.getValue().getScore()));
        System.out.println("学号\t姓名\t专业\t成绩");
        Boolean b=true;
        for(String key:student.keySet()){
            Student s=student.get(key);
            if(key.contains(id)){
                System.out.println(key+"\t"+s.getName()+"\t"+s.getProfessional()+"\t"+s.getScore());
                b=false;
            }
        }
        if (b){
            System.out.println("没有查询到学生信息！");
        }

    }
    public static void add(){
        System.out.println("输入需要新增的学号：");
        String id= sc.nextLine();
        System.out.println("输入需要新增的姓名：");
        String name= sc.nextLine();
        System.out.println("输入需要新增的专业：");
        String professional= sc.nextLine();
        System.out.println("输入需要新增的成绩：");
        double score= sc.nextDouble();
        Student s=new Student(id,name,professional,score);
        student.put(id,s);
        System.out.println("新增成功！");
        Output();
    }
    public static void delete(){
        System.out.println("输入需要删除的学号：（输入多个学号以空格分隔开）");
        String str= sc.nextLine();
        String[] strs=str.split(" ");
        Boolean b=true;
        Iterator<String> i=student.keySet().iterator();
        while (i.hasNext()){
            String key=i.next();
            for (String s:strs){
                if(s.equals(key)){
                    i.remove();
                    b=false;
                    System.out.println("已成功删除学号为："+key+"的学生");
                }
            }
        }
        if(b){
            System.out.println("没有查询到删除的学生信息！");
        }
        Output();
    }
    public static void Input(){
        try (FileInputStream fis=new FileInputStream("d:\\IO\\student.txt");
             ObjectInputStream ois=new ObjectInputStream(fis))
        {
         student=(Map<String, Student>) ois.readObject();
        }catch (FileNotFoundException e) {
            System.out.println("欢迎第一使用，系统自动创建文件");
        }catch (IOException  | ClassNotFoundException e){
            e.printStackTrace();
        }
    }
    public static void Output(){
        try (
                FileOutputStream fos=new FileOutputStream("d:\\IO\\student.txt");
             ObjectOutputStream oos=new ObjectOutputStream(fos)
        ){
            oos.writeObject(student);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
class Student implements Serializable{
   private String id;
   private String name;
   private String professional;
   private double score;
    public Student(String id,String name,String professional,double score){
    this.id=id;
    this.name=name;
    this.professional=professional;
    this.score=score;
}

    public String getName() {
        return name;
    }
    public String getProfessional() {
        return professional;
    }
    public double getScore() {
        return score;
    }
}